package com.org.utils.sql;

import java.lang.reflect.Method;

import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.json.JSONObject;


 

public class JsonHandler
{
	/**
	 * 一个SQL串，在查询句子上的表现只有被引号包含与否 当前工具判断为：数字不被包含，字符串被包含 var item={
	 * columnName:"goodName", dataType:"string",//string,date,number
	 * values:goodName, queryType:"vague" //vague,equals,range };
	 * 
	 * @param json
	 * @return ken 2014-1-10
	 */
	public static String jsonToSQLConditions(JSONArray arrs)
	{
		try
		{
			String[] conditions = new String[arrs.length()];
			// 遍历查询条件集合，以拼接查询字符串
			for (int i = 0; i < arrs.length(); i++)
			{
				// 获取单个查询条件
				// 将JSON对象转换为查询对象
				SQLConditionItem item = (SQLConditionItem) JsonHandler.jsonToObject(SQLConditionItem.class, arrs.getJSONObject(i));
				// 判断查询类型
				if (item.getQueryType() != null && !item.getQueryType().trim().isEmpty())
				{
					/**
					 * 模糊查询,仅支持字符串
					 */
					if (item.getQueryType().equals(SQLConditionItem.QUERY_TYPE_VAGUE))
					{
						if (item.getDataType() != null && !item.getDataType().trim().isEmpty() && item.getDataType().trim().equals(SQLConditionItem.DATA_TYPE_STRING))
						{
							// 判断值是否为空
							if (!item.getValue().trim().isEmpty())
							{
								conditions[i] = item.getColumnName() + " like '%" + item.getValue() + "%'";
							}
						}
					}
					/**
					 * 相等查询,支持所有
					 */
					if (item.getQueryType().equals(SQLConditionItem.QUERY_TYPE_EQUAL))
					{
						// 判断数字和非数字类型
						if (item.getDataType() != null && !item.getDataType().trim().isEmpty() && item.getDataType().trim().equals(SQLConditionItem.DATA_TYPE_NUMBER))
						{
							// 判断值是否为空
							if (!item.getValue().trim().isEmpty())
							{
								conditions[i] = item.getColumnName() + " =" + item.getValue();
							}
						} else
						{
							// 判断值是否为空
							if (!item.getValue().trim().isEmpty())
							{
								conditions[i] = item.getColumnName() + " ='" + item.getValue() + "'";
							}
						}
					}
					/**
					 * 范围查询，仅支持数字和日期类型
					 */
					if (item.getQueryType().equals(SQLConditionItem.QUERY_TYPE_RANGE))
					{
						/**
						 * 判断数字类型
						 */
						if (item.getDataType() != null && !item.getDataType().trim().isEmpty() && item.getDataType().trim().equals(SQLConditionItem.DATA_TYPE_NUMBER))
						{
							// 判断值是否为空
							if (!item.getValue().trim().isEmpty())
							{
								// 判断值类型
								// 判断是否带，号分隔
								String value = item.getValue().trim();
								if (value.contains(","))
								{
									String[] vs = value.split(",");
									String temp = new String();
									String startValue = vs[0].trim();
									String entValue = vs.length > 1 ? vs[1].trim() : "";

									// 判断起始值是否有值,并且值为有效数字
									if (!startValue.isEmpty() && StringUtils.isNumeric(startValue))
									{
										temp = item.getColumnName() + " >=" + startValue;
									}
									if (!entValue.isEmpty() && StringUtils.isNumeric(entValue))
									{
										temp += temp.isEmpty() ? (item.getColumnName() + " <=" + entValue) : (" and " + item.getColumnName() + " <=" + entValue);
									}
									conditions[i] = "(" + temp + ")";
								}
							}
						}

						/**
						 * 判断日期类型
						 */
						if (item.getDataType() != null && !item.getDataType().trim().isEmpty() && item.getDataType().trim().equals(SQLConditionItem.DATA_TYPE_DATE))
						{
							// 判断值是否为空
							if (!item.getValue().trim().isEmpty())
							{
								// 判断值类型
								// 判断是否带，号分隔
								String value = item.getValue().trim();
								if (value.contains(","))
								{
									String[] vs = value.split(",");
									String temp = new String();
									String startValue = vs[0].trim();
									String entValue = vs.length > 1 ? vs[1].trim() : "";

									// 判断起始值是否有值
									if (!startValue.isEmpty())
									{
										temp = item.getColumnName() + " >='" + startValue + "'";
									}
									if (!entValue.isEmpty())
									{
										temp += temp.isEmpty() ? (item.getColumnName() + " <='" + entValue + "'") : (" and " + item.getColumnName() + " <='" + entValue + "'");
									}
									conditions[i] = "(" + temp + ")";
								}
							}
						}
					}
					/**
					 * in 包含查询
					 * 支持数字和字符串
					 */
					if (item.getQueryType().equals(SQLConditionItem.QUERY_TYPE_IN))
					{
						/**
						 * 判断数字类型
						 */
						if (item.getDataType() != null && !item.getDataType().trim().isEmpty() && item.getDataType().trim().equals(SQLConditionItem.DATA_TYPE_NUMBER))
						{
							// 判断值是否为空
							if (!item.getValue().trim().isEmpty())
							{
								
							}
						}
						/**
						 * 判断字符串类型
						 */
						if (item.getDataType() != null && !item.getDataType().trim().isEmpty() && item.getDataType().trim().equals(SQLConditionItem.DATA_TYPE_NUMBER))
						{
							// 判断值是否为空
							if (!item.getValue().trim().isEmpty())
							{
								
							}
						}
					}
				}

			}

			return StringUtils.join(conditions, " and ");
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将JSON对象转换为Java类
	 * 
	 * @param c
	 *            转换目标的类CLASS
	 * @param json
	 *            json对象
	 * @return 已转换好的对象 ken-2014-1-10
	 */
	public static Object jsonToObject(Class c, JSONObject json)
	{
		try
		{
			Object instance = c.newInstance();
			// 获取所有的方法
			Method[] methods = c.getDeclaredMethods();
			for (int i = 0; i < methods.length; i++)
			{
				String methodName = methods[i].getName();
				// 判断是否pojo的set方法
				if (methodName.startsWith("set"))
				{
					// 从方法名获取field的名称
					String fieldName = methodName.substring(3);
					String firstLetter = fieldName.substring(0, 1).toLowerCase();
					String otherLetter = fieldName.substring(1);
					fieldName = firstLetter + otherLetter;
					// 判断JSON里是否包含此fieldName，如果包含则执行set方法，赋值
					if (json.has(fieldName))
					{
						methods[i].invoke(instance, json.get(fieldName));
					}
				}
			}
			return instance;
		} catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
}
